#coding: utf-8
#-------------------------------------------------------------------------------
# Name:        InterfaceTkinter
# Purpose:     Possui janelas desenhadas em Tkinter, cada qual com seu controle de eventos
#
# Author:      Johann
#
# Created:     11/11/2010
# Copyright:   (c) Johann 2010
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

from Tkinter import *
from tkMessageBox import showinfo, showerror

from Transito import Transito
from InterfacePygame import InterfacePygame

class InterfaceTkinter:
    """Possui janelas desenhadas em Tkinter, cada qual com seu controle de eventos"""

    def janelaNovoUsuario(self):

        self.root = Tk()

        self.root.title("Novo usuário")
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.confirmar = False

        textFrame = Frame(self.root)

        # Cria um Label com textFrame (para escrever o nome do usuário)
        entryLabelUsuario = Label(textFrame)
        entryLabelUsuario["text"] = "Nome do usuário* :"
        entryLabelUsuario.pack(side=TOP)

        # Cria uma entry no textFrame (para o nome do usuário)
        self.entryWidgetUsuario = Entry(textFrame)
        self.entryWidgetUsuario["width"] = 50
        self.entryWidgetUsuario.pack(side=TOP)

        # Cria um Label com textFrame (para escrever a senha)
        entryLabelSenha = Label(textFrame)
        entryLabelSenha["text"] = "Senha* :"
        entryLabelSenha.pack(side=TOP)

        # Cria uma entry no textFrame (para a senha)
        self.entryWidgetSenha = Entry(textFrame, show = "*")
        self.entryWidgetSenha["width"] = 10
        self.entryWidgetSenha.pack(side=TOP)

        # Cria um Label com textFrame (para escrever o endereço do e-mail)
        entryLabelEmail = Label(textFrame)
        entryLabelEmail["text"] = "E-mail* :"
        entryLabelEmail.pack(side=TOP)

        # Cria uma entry no textFrame (para o endereço do e-mail)
        self.entryWidgetEmail = Entry(textFrame)
        self.entryWidgetEmail["width"] = 20
        self.entryWidgetEmail.pack(side=TOP)

        # Cria um Label com textFrame (para escrever o nome da cidade)
        entryLabelCidade = Label(textFrame)
        entryLabelCidade["text"] = "Cidade* (espaços no nome da cidade DEVEM ser separados por _, acentos NÃO são suportados):"
        entryLabelCidade.pack(side=TOP)

        # Cria uma entry no textFrame (para o nome da cidade)
        self.entryWidgetCidade = Entry(textFrame)
        self.entryWidgetCidade["width"] = 15
        self.entryWidgetCidade.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.confirmarNovoUsuario)
        button.pack()

        self.root.mainloop()

        if self.confirmar == True:
            usuario, senha, email, cidade = self.entryWidgetUsuario.get(), self.entryWidgetSenha.get(), self.entryWidgetEmail.get(), self.entryWidgetCidade.get()
            try: self.root.destroy()
            except: pass
            return usuario, senha, email, cidade
        else:
            try: self.root.destroy()
            except: pass
            return False

    def confirmarNovoUsuario(self):

        if self.entryWidgetUsuario.get().strip() == "" or self.entryWidgetEmail.get().strip() == "" or self.entryWidgetSenha.get().strip() == "" or self.entryWidgetCidade.get().strip() == "":
            showerror("Adicionando novo usuario...", "Erro! Os campos NOME DO USUÁRIO, SENHA, E-MAIL e CIDADE devem ser obrigatoriamente preenchidos!")
            self.confirmar = False
        # não é possível regitrar caso o e-mail esteja errado (sem arroba)
        elif "@" not in self.entryWidgetEmail.get():
            showerror("Adicionando novo usuario...", "Erro! E-mail inválido!")
            self.confirmar = False
        else:
            showinfo("Adicionando novo usuário...", "Usuário adicionado com SUCESSO: ")
            self.confirmar = True

        # destrói a janela de input
        self.root.quit()

    def janelaVisualizarTransito(self, listaeventos):

        self.root = Tk()

        self.root.title("Transito local agora")
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.confirmar = False

        textFrame = Frame(self.root)

        # percorre a lista de eventos de trânsito, carregando no label
        for evento in listaeventos:
            labelTransito = Label(textFrame)
            labelTransito["text"] = evento
            labelTransito.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Voltar", command=self.root.destroy)
        button.pack()

        self.root.mainloop()

    def janelaVisualizarTodosLembretes(self, conta, datasordenadas):

        self.root = Tk()

        self.root.title("Todos os lembretes registrados do usuário")
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.confirmar = False

        textFrame = Frame(self.root)

        for data in datasordenadas:
            labelTransito = Label(textFrame)
            labelTransito["text"] = data[:2] + "/" + data[2:]
            labelTransito.pack(side=TOP)
            for lembrete in conta.listalembretes:
                if lembrete.getData() == data:
                    labelTransito = Label(textFrame)
                    labelTransito["text"] = lembrete.getHora() + " " + lembrete.getTexto()
                    labelTransito.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Voltar", command=self.root.destroy)
        button.pack()

        self.root.mainloop()

    def janelaBuscarUsuario(self):

        self.root = Tk()

        self.root.title("Buscar Usuario")
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.campopreenchido = False

        textFrame = Frame(self.root)

        # Cria um Label com textFrame (para escrever o nome do usuário a ser editado)
        entryLabelUsuario = Label(textFrame)
        entryLabelUsuario["text"] = "Digite o nome completo do usuário o qual deseja alterar* :"
        entryLabelUsuario.pack(side=TOP)

        # Cria uma entry no textFrame (para o nome do usuário)
        self.entryWidgetUsuario = Entry(textFrame)
        self.entryWidgetUsuario["width"] = 50
        self.entryWidgetUsuario.pack(side=TOP)

        # Cria um Label com textFrame (para escrever a senha)
        entryLabelSenha = Label(textFrame)
        entryLabelSenha["text"] = "Digite a senha do usuário o qual deseja alterar* :"
        entryLabelSenha.pack(side=TOP)

        # Cria uma entry no textFrame (para a senha)
        self.entryWidgetSenha = Entry(textFrame, show = "*")
        self.entryWidgetSenha["width"] = 10
        self.entryWidgetSenha.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.confirmarBuscarUsuario)
        button.pack()

        self.root.mainloop()

        if self.campopreenchido == True:
            usuario, senha = self.entryWidgetUsuario.get(), self.entryWidgetSenha.get()
            try: self.root.destroy()
            except: pass
            return usuario, senha
        else:
            try: self.root.destroy()
            except: pass
            return False

    def confirmarBuscarUsuario(self):

        if self.entryWidgetUsuario.get().strip() == "" or self.entryWidgetSenha.get().strip() == "":
            showerror("Buscando usuario...", "Erro! Todos os campos devem ser obrigatoriamente preenchidos!")
            self.campopreenchido = False
        else:
            self.campopreenchido = True

        # destrói a janela de input
        self.root.quit()

    def janelaNovoLembrete(self):

        self.root = Tk()

        self.root.title("Novo lembrete")
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.confirmar = False

        # Cria um frame para carregar a label e o textFrame
        textFrame = Frame(self.root)

        # Cria um Label com textFrame (para escrever o lembrete)
        entryLabelLembrete = Label(textFrame)
        entryLabelLembrete["text"] = "Lembrete* :"
        entryLabelLembrete.pack(side=TOP)

        # Cria uma entry no textFrame (para o lembrete)
        self.entryWidgetLembrete = Entry(textFrame)
        self.entryWidgetLembrete["width"] = 50
        self.entryWidgetLembrete.pack(side=TOP)

        # Cria um Label com textFrame (para escrever a hora)
        # atenção! esse campo não é de preenchimento obrigatório,
        # não o preenchendo, não há hora marcada para realizar a tarefa
        entryLabelHora = Label(textFrame)
        entryLabelHora["text"] = "Hora (xx:xx): *preencha apenas se seu lembrete tiver hora marcada*"
        entryLabelHora.pack(side=TOP)

        # Cria uma entry no textFrame (para a hora)
        self.entryWidgetHora = Entry(textFrame)
        self.entryWidgetHora["width"] = 5
        self.entryWidgetHora.pack(side=TOP)

        # Cria um Label com textFrame (para escrever a data)
        # atenção! esse campo não é de preenchimento obrigatório,
        # não o preenchendo, o dia para realizar a tarefa será hoje
        entryLabelData = Label(textFrame)
        entryLabelData["text"] = "Data (ddmm): *preencha apenas se seu lembrete não for para hoje*"
        entryLabelData.pack(side=TOP)

        # Cria uma entry no textFrame (para a data)
        self.entryWidgetData = Entry(textFrame)
        self.entryWidgetData["width"] = 4
        self.entryWidgetData.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.confirmarNovoLembrete)
        button.pack()

        self.root.mainloop()

        if self.confirmar == True:
            texto, hora, data = self.entryWidgetLembrete.get(), self.entryWidgetHora.get(), self.entryWidgetData.get()

            try: self.root.destroy()
            except: pass
            return texto, hora, data
        else:
            try: self.root.destroy()
            except: pass
            return False

    def checarFormatacaoHora(self, hora):
        """Checa se a hora foi digitada corretamente (formato hh:mm)"""

        if ":" in hora and (len(hora) == 4 or len(hora) == 5):
            try:
                int(hora.split(":")[0])
                int(hora.split(":")[1])

                # não existe hora maior que 23 (24 é 00)
                if int(hora.split(":")[0]) > 23:
                    return False

                # não existe minuto maior que 59 (60 é 00)
                if int(hora.split(":")[1]) > 59:
                    return False

            except:
                return False
            return True
        return False

    def checarFormatacaoData(self, data):
        """Checa se a data foi digitada corretamente (formato ddmm)"""

        if len(data) == 4:
            try:
                int(data)

                # não existe dia do mês maior que 31 ou que seja 00
                if int(data[:2]) > 31 or int(data[:2]) == 00:
                    return False

                # não existe mês maior que 12 ou que seja 00
                if int(data[3:]) > 12 or int(data[3:]) == 00:
                    return False
            except:
                return False
            return True
        return False

    def confirmarNovoLembrete(self):

        self.confirmar = True

        if self.entryWidgetLembrete.get().strip() == "":
            showerror("Adicionando novo lembrete...", "Erro! O campo LEMBRETE deve ser obrigatoriamente preenchido!")
            self.confirmar = False

        else:
            if self.entryWidgetHora.get().strip() != "":
                if self.checarFormatacaoHora(self.entryWidgetHora.get()) == False:
                    showerror("Adicionando novo lembrete...", "Erro! O campo HORA não está corretamente preenchido (obedeça o formato hh:mm)!")
                    self.confirmar = False

                if self.entryWidgetData.get().strip() != "":
                    if self.checarFormatacaoData(self.entryWidgetData.get()) == False:
                        showerror("Adicionando novo lembrete...", "Erro! O campo DATA não está corretamente preenchido (obedeça o formato ddmm)!")
                        self.confirmar = False

            # se self.confirmar continua True...
            if self.confirmar == True:
                showinfo("Adicionando novo lembrete...", "Lembrete adicionado com SUCESSO: " + self.entryWidgetLembrete.get().strip())
                self.confirmar = True

        # destrói a janela de input
        self.root.quit()

    def janelaBuscarLembrete(self):

        self.root = Tk()

        self.root.title("Buscar lembrete")
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.campopreenchido = False

        textFrame = Frame(self.root)

        # Cria um Label com textFrame (para escrever a hora)
        entryLabelHora = Label(textFrame)
        entryLabelHora["text"] = "Digite a hora do lembrete* (hh:mm):"
        entryLabelHora.pack(side=TOP)

        # Cria uma entry no textFrame (para a hora)
        self.entryWidgetHora = Entry(textFrame)
        self.entryWidgetHora["width"] = 10
        self.entryWidgetHora.pack(side=TOP)

        # Cria um Label com textFrame (para escrever a data)
        entryLabelData = Label(textFrame)
        entryLabelData["text"] = "Digite a data do lembrete* (ddmm):"
        entryLabelData.pack(side=TOP)

        # Cria uma entry no textFrame (para a data)
        self.entryWidgetData = Entry(textFrame)
        self.entryWidgetData["width"] = 4
        self.entryWidgetData.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.confirmarBuscarLembrete)
        button.pack()

        self.root.mainloop()

        if self.campopreenchido == True:
            hora, data = self.entryWidgetHora.get(), self.entryWidgetData.get()
            try: self.root.destroy()
            except: pass
            return hora, data
        else:
            try: self.root.destroy()
            except: pass
            return False

    def confirmarBuscarLembrete(self):

        if self.entryWidgetHora.get().strip() == "":
            showerror("Buscando lembrete...", "Erro! O campo HORA deve ser obrigatoriamente preenchido!")
            self.campopreenchido = False
        else:
            self.campopreenchido = True

        # destrói a janela de input
        self.root.quit()

    def janelaEditarUsuario(self, usuario):

        self.root = Tk()

        self.root.title("Editar usuário " + usuario)
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.confirmar = False

        textFrame = Frame(self.root)

        # Cria um Label com textFrame (para escrever o nome do usuário)
        entryLabelUsuario = Label(textFrame)
        entryLabelUsuario["text"] = "Novo nome do usuário* :"
        entryLabelUsuario.pack(side=TOP)

        # Cria uma entry no textFrame (para o nome do usuário)
        self.entryWidgetUsuario = Entry(textFrame)
        self.entryWidgetUsuario["width"] = 50
        self.entryWidgetUsuario.pack(side=TOP)

        # Cria um Label com textFrame (para escrever a senha)
        entryLabelSenha = Label(textFrame)
        entryLabelSenha["text"] = "Nova senha* :"
        entryLabelSenha.pack(side=TOP)

        # Cria uma entry no textFrame (para a senha)
        self.entryWidgetSenha = Entry(textFrame, show = "*")
        self.entryWidgetSenha["width"] = 10
        self.entryWidgetSenha.pack(side=TOP)

        # Cria um Label com textFrame (para escrever o endereço do e-mail)
        entryLabelEmail = Label(textFrame)
        entryLabelEmail["text"] = "Novo e-mail* :"
        entryLabelEmail.pack(side=TOP)

        # Cria uma entry no textFrame (para o endereço do e-mail)
        self.entryWidgetEmail = Entry(textFrame)
        self.entryWidgetEmail["width"] = 20
        self.entryWidgetEmail.pack(side=TOP)

        # Cria um Label com textFrame (para escrever o nome da cidade)
        entryLabelCidade = Label(textFrame)
        entryLabelCidade["text"] = "Nova cidade : *se não preenchido, o sistema tentará localizar automaticamente a sua cidade*"
        entryLabelCidade.pack(side=TOP)

        # Cria uma entry no textFrame (para o nome da cidade)
        self.entryWidgetCidade = Entry(textFrame)
        self.entryWidgetCidade["width"] = 15
        self.entryWidgetCidade.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.confirmarEditarUsuario)
        button.pack()

        self.root.mainloop()

        if self.confirmar == True:
            usuario, senha, email, cidade = self.entryWidgetUsuario.get(), self.entryWidgetSenha.get(), self.entryWidgetEmail.get(), self.entryWidgetCidade.get()
            try: self.root.destroy()
            except: pass
            return usuario, senha, email, cidade
        else:
            try: self.root.destroy()
            except: pass
            return False

    def confirmarEditarUsuario(self):

        if self.entryWidgetUsuario.get().strip() == "" or self.entryWidgetEmail.get().strip() == "" or self.entryWidgetSenha.get().strip() == "":
            showerror("Editando usuário...", "Erro! Os campos NOME DO USUÁRIO, SENHA e E-MAIL devem ser obrigatoriamente preenchidos!")
            self.confirmar = False
        # não é possível regitrar caso o e-mail esteja errado (sem arroba)
        elif "@" not in self.entryWidgetEmail.get():
            showerror("Editando usuário...", "Erro! E-mail inválido!")
            self.confirmar = False
        else:
            showinfo("Editando usuário...", "Usuário adicionado com SUCESSO: ")
            self.confirmar = True

        # destrói a janela de input
        self.root.quit()

    def janelaMensagem(self, titulo, texto, imagem = None):

        self.root = Tk()

        self.root.title(titulo)
        self.root["padx"] = 10
        self.root["pady"] = 10

        textFrame = Frame(self.root)

        if imagem != None:

            self.canvas = Canvas(width = 0, height = 75) ## cria um canvas, que seria um espaço que pode ter fundo colorido
            self.giflogo = PhotoImage(file = imagem) ## cria uma imagem a partir de um endereço (só GIF é aceito), poderia ser file = C:\Doc.... etc.
                                                      ## é que aqui a imagem está na mesma pasta que esse módulo
            self.canvas.create_image(50, 0, image = self.giflogo, anchor = NW) ## cria no canvas a imagem
            self.canvas.pack(expand = YES, fill = BOTH) ## exibe o canvas

        entryLabel = Label(textFrame)
        entryLabel["text"] = texto
        entryLabel.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.root.destroy)
        button.pack()

        self.root.mainloop()

    def janelaLogar(self, usuario):

        self.root = Tk()

        self.root.title("Logar como " + usuario)
        self.root["padx"] = 10
        self.root["pady"] = 10

        self.campopreenchido = False

        textFrame = Frame(self.root)

        # Cria um Label com textFrame (para escrever a senha)
        entryLabelSenha = Label(textFrame)
        entryLabelSenha["text"] = "Senha* :"
        entryLabelSenha.pack(side=TOP)

        # Cria uma entry no textFrame (para a senha)
        self.entryWidgetSenha = Entry(textFrame, show = "*")
        self.entryWidgetSenha["width"] = 50
        self.entryWidgetSenha.pack(side=TOP)

        textFrame.pack()

        button = Button(self.root, text="Submit", command=self.confirmarLogar)
        button.pack()

        self.root.mainloop()

        if self.campopreenchido == True:
            senha = self.entryWidgetSenha.get()
            try: self.root.destroy()
            except: pass
            return senha
        else:
            try: self.root.destroy()
            except: pass
            return False

    def confirmarLogar(self):

        if self.entryWidgetSenha.get().strip() == "":
            showerror("Logando usuario...", "Erro! O campo SENHA deve ser obrigatoriamente preenchido!")
            self.campopreenchido = False
        else:
            self.campopreenchido = True

        # destrói a janela de input
        self.root.quit()

def main():
##    transito = Transito()
##    interfacetkinter = InterfaceTkinter()
##    print interfacetkinter.janelaNovoLembrete()
##    print interfacetkinter.janelaNovoUsuario()
##    print interfacetkinter.janelaVisualizarTransito(transito.atualizarEventos(transito.localizarTwitter("Recife")))
    pass

if __name__ == '__main__':
    main()
